#ifndef _IUPACKET_HPP_
#define _IUPACKET_HPP_

#ifdef _SOLARIS_
#include <inttypes.h>
#else
#include <stdint.h>
#endif
#include <cstring>

/**
 * @brief Lit les 16 bits situes a l'adresse "src" et les place dans la variable "dest"
 */
#define READ16(dest, src) \
{ \
   memcpy(&dest, src, 2); \
   dest = ntohs(dest); \
   src += 2; \
}

/**
 * @brief Lit les 32 bits situes a l'adresse "src" et les place dans la variable "dest"
 */
#define READ32(dest, src) \
{ \
   memcpy(&dest, src, 4); \
   dest = ntohl(dest); \
   src += 4; \
}

/**
 * @brief Ecrit les 16 bits de la valeur "src" dans l'adresse "dest"
 */
#define WRITE16(dest, src) \
{ \
   uint16_t tmp16; \
   tmp16 = htons(src); \
   memcpy(dest, &tmp16, 2); \
   dest += 2; \
}

/**
 * @brief Ecrit les 32 bits de la valeur "src" dans l'adresse "dest"
 */
#define WRITE32(dest, src) \
{ \
   uint32_t tmp32; \
   tmp32 = htonl(src); \
   memcpy(dest, &tmp32, 4); \
   dest += 4; \
}

/**
 * @brief Interface servant de base aux differents paquets supportes (Ethernet, IP, ICMP et ARP)
 */
class iuPacket
{
public:
   virtual ~iuPacket() {}
   
   virtual uint16_t getBufferLen() const = 0;
   virtual uint16_t fromBuffer(const char *buffer, uint16_t len) = 0;
   virtual uint16_t toBuffer(char *buffer) const = 0;
   
   void copy(const iuPacket &packet);
};

#endif
